{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [],
   "source": [
    "#这个是训练模型\n",
    "# 首先 import 必要的模块\n",
    "import pandas as pd \n",
    "import numpy as np\n",
    "\n",
    "from sklearn.model_selection import GridSearchCV\n",
    "\n",
    "#竞赛的评价指标为logloss\n",
    "from sklearn.metrics import log_loss  \n",
    "\n",
    "from matplotlib import pyplot\n",
    "import seaborn as sns\n",
    "%matplotlib inline"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>bathrooms</th>\n",
       "      <th>bedrooms</th>\n",
       "      <th>latitude</th>\n",
       "      <th>price</th>\n",
       "      <th>longitude</th>\n",
       "      <th>interest_level</th>\n",
       "      <th>Dining Room</th>\n",
       "      <th>Pre-War</th>\n",
       "      <th>Laundry in Building</th>\n",
       "      <th>Dishwasher</th>\n",
       "      <th>...</th>\n",
       "      <th>Cats Allowed</th>\n",
       "      <th>Doorman</th>\n",
       "      <th>Elevator</th>\n",
       "      <th>No Fee</th>\n",
       "      <th>Laundry in Unit</th>\n",
       "      <th>Fitness Center</th>\n",
       "      <th>Roof Deck</th>\n",
       "      <th>High Speed Internet</th>\n",
       "      <th>Outdoor Space</th>\n",
       "      <th>interest_level.1</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>0.285714</td>\n",
       "      <td>0.2</td>\n",
       "      <td>0.907033</td>\n",
       "      <td>0.152488</td>\n",
       "      <td>0.374708</td>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "      <td>...</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>0.285714</td>\n",
       "      <td>0.4</td>\n",
       "      <td>0.907935</td>\n",
       "      <td>0.243061</td>\n",
       "      <td>0.374553</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "      <td>...</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>0.285714</td>\n",
       "      <td>0.4</td>\n",
       "      <td>0.908073</td>\n",
       "      <td>0.223329</td>\n",
       "      <td>0.374635</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "      <td>...</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>0.428571</td>\n",
       "      <td>0.6</td>\n",
       "      <td>0.907115</td>\n",
       "      <td>0.191305</td>\n",
       "      <td>0.374804</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>...</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>0.285714</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.907770</td>\n",
       "      <td>0.178042</td>\n",
       "      <td>0.374536</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>...</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>5 rows × 22 columns</p>\n",
       "</div>"
      ],
      "text/plain": [
       "   bathrooms  bedrooms  latitude     price  longitude  interest_level  \\\n",
       "0   0.285714       0.2  0.907033  0.152488   0.374708               1   \n",
       "1   0.285714       0.4  0.907935  0.243061   0.374553               0   \n",
       "2   0.285714       0.4  0.908073  0.223329   0.374635               1   \n",
       "3   0.428571       0.6  0.907115  0.191305   0.374804               1   \n",
       "4   0.285714       0.0  0.907770  0.178042   0.374536               0   \n",
       "\n",
       "   Dining Room  Pre-War  Laundry in Building  Dishwasher        ...         \\\n",
       "0            1        1                    1           1        ...          \n",
       "1            0        0                    1           1        ...          \n",
       "2            0        0                    1           1        ...          \n",
       "3            0        0                    0           0        ...          \n",
       "4            0        0                    1           0        ...          \n",
       "\n",
       "   Cats Allowed  Doorman  Elevator  No Fee  Laundry in Unit  Fitness Center  \\\n",
       "0             1        0         0       0                0               0   \n",
       "1             0        1         1       1                0               0   \n",
       "2             0        1         1       0                1               0   \n",
       "3             0        0         0       0                0               0   \n",
       "4             0        1         1       0                0               1   \n",
       "\n",
       "   Roof Deck  High Speed Internet  Outdoor Space  interest_level.1  \n",
       "0          0                    0              0                 1  \n",
       "1          0                    0              0                 0  \n",
       "2          0                    0              0                 1  \n",
       "3          0                    0              0                 1  \n",
       "4          0                    0              0                 0  \n",
       "\n",
       "[5 rows x 22 columns]"
      ]
     },
     "execution_count": 4,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "train = pd.read_csv(\"FE_RentListingInquries2.csv\")\n",
    "train.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [],
   "source": [
    "X = train.drop(\"interest_level\", axis = 1)\n",
    "y = train['interest_level']\n",
    "#将数据分割训练数据与测试数据\n",
    "from sklearn.model_selection import train_test_split\n",
    "\n",
    "# 随机采样20%的数据构建测试样本，其余作为训练样本\n",
    "X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=33, test_size=0.2)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 34,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "LogisticRegressionCV(Cs=[1000, 1500, 2000, 3000], class_weight='balanced',\n",
       "           cv=5, dual=False, fit_intercept=True, intercept_scaling=1.0,\n",
       "           max_iter=100, multi_class='ovr', n_jobs=1, penalty='l1',\n",
       "           random_state=None, refit=True, scoring='neg_log_loss',\n",
       "           solver='liblinear', tol=0.0001, verbose=0)"
      ]
     },
     "execution_count": 34,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "from sklearn.linear_model import LogisticRegressionCV\n",
    "\n",
    "#Cs = [1, 10,100,1000] # 这个值 预测的不够好，还可以调优\n",
    "Cs = [1000,1500, 2000, 3000]\n",
    "\n",
    "# 大量样本（6W+）、高维度（93），L1正则 --> 可选用saga优化求解器(0.19版本新功能)\n",
    "# LogisticRegressionCV比GridSearchCV快\n",
    "lrcv_L1 = LogisticRegressionCV(Cs=Cs, cv = 5, scoring='neg_log_loss', penalty='l1', solver='liblinear', multi_class='ovr',class_weight='balanced')\n",
    "lrcv_L1.fit(X_train, y_train)  "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 35,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "{0: array([[-5.20691309e-05, -6.15882828e-05, -6.79974375e-05,\n",
       "         -6.47702366e-05],\n",
       "        [-3.35586784e-05, -1.48680269e-05, -3.44735630e-05,\n",
       "         -2.33050332e-05],\n",
       "        [-1.79142723e-05, -3.71397702e-05, -3.97197316e-05,\n",
       "         -2.00116772e-05],\n",
       "        [-3.90519476e-05, -5.47376690e-05, -1.04712775e-05,\n",
       "         -6.11917047e-05],\n",
       "        [-3.15709223e-05, -6.06647983e-05, -4.64894615e-05,\n",
       "         -6.44739650e-05]]),\n",
       " 1: array([[-0.55249303, -0.5524983 , -0.55249452, -0.55249912],\n",
       "        [-0.55738128, -0.55739069, -0.55737404, -0.55739143],\n",
       "        [-0.55483811, -0.55489445, -0.55488836, -0.55487905],\n",
       "        [-0.55469338, -0.55468998, -0.55469373, -0.55469767],\n",
       "        [-0.55465857, -0.55465327, -0.55465125, -0.55465384]]),\n",
       " 2: array([[-2.79905987e-06, -9.20131829e-06, -3.17758103e-06,\n",
       "         -3.40465745e-06],\n",
       "        [-4.88057281e-06, -4.81113006e-06, -4.13419553e-06,\n",
       "         -5.19824308e-06],\n",
       "        [-4.70614191e-06, -8.84513924e-06, -4.35636834e-06,\n",
       "         -5.09062959e-06],\n",
       "        [-4.40352599e-06, -5.50046482e-06, -4.29079720e-06,\n",
       "         -5.36101078e-06],\n",
       "        [-3.46897221e-06, -5.72060327e-06, -5.95614032e-06,\n",
       "         -4.70397346e-06]])}"
      ]
     },
     "execution_count": 35,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "lrcv_L1.scores_"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 36,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x7f6a20bf3438>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "# scores_：dict with classes as the keys, and the values as the grid of scores obtained during cross-validating each fold,\n",
    "# Each dict value has shape (n_folds, len(Cs))\n",
    "n_Cs = len(Cs)\n",
    "n_classes = 3\n",
    "scores =  np.zeros((n_classes,n_Cs))\n",
    "\n",
    "for j in range(0 ,n_classes):\n",
    "    scores[j][:] = np.mean(lrcv_L1.scores_[j],axis = 0)\n",
    "    \n",
    "mse_mean = -np.mean(scores, axis = 0)\n",
    "pyplot.plot(np.log10(Cs), mse_mean.reshape(n_Cs,1)) \n",
    "#plt.plot(np.log10(reg.Cs)*np.ones(3), [0.28, 0.29, 0.30])\n",
    "pyplot.xlabel('log(C)')\n",
    "pyplot.ylabel('logloss')\n",
    "pyplot.show()\n",
    "\n",
    "#print ('C is:',lr_cv.C_)  #对多类分类问题，每个类别的分类器有一个C\n",
    "#通过下面的图, nll 应该是 越大越好, log loss 越小越好, 所以 最好的 c 为1000, log loss为0.000002 ..., 这也太准了吧\n",
    "#使用l2 的话 c 最好为2000 ll 为0.00007"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 37,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "1.0\n",
      "1.0\n"
     ]
    }
   ],
   "source": [
    "print(lrcv_L1.score(X_test, y_test))\n",
    "print(lrcv_L1.score(X_train, y_train))\n",
    "#通过这里的得分 还是 l1 稍好一点，其实 差距 太小了"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "#接下来SVM"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.6.4"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
